import { defineStore } from 'pinia'
import { login as loginApi, refreshToken as refreshTokenApi} from '@/api/user'

// 添加一个缓存的刷新Promise
let refreshTokenPromise = null

export const useUserStore = defineStore('user', {
  // 状态
  state: () => ({
    // 用户信息
    userInfo: null,
    // 访问令牌
    accessToken: null,
    // 令牌过期时间
    expiresIn: null,
    // 登录状态
    isLoggedIn: false,
    // 权限列表
    permissions: [],
    // 收货地址列表
    addresses: [],
    // 用户设置
    settings: {
      theme: 'light',
      notification: true,
      language: 'zh-CN'
    }
  }),

  // 计算属性
  getters: {
    // 获取用户名
    username: (state) => state.userInfo?.username || '未登录',
    // 获取用户头像
    avatar: (state) => state.userInfo?.avatar || '/images/default-avatar.png',
    // 检查是否有特定权限
    hasPermission: (state) => (permission) => state.permissions.includes(permission),
    // 获取默认收货地址
    defaultAddress: (state) => state.addresses.find(addr => addr.isDefault),
    // 检查token是否过期
    isTokenExpired: (state) => {
      if (!state.expiresIn) return true
      return Date.now() >= state.expiresIn
    }
  },

  // 操作方法
  actions: {
    // 设置用户信息
    setUserInfo(info) {
      this.userInfo = info
      this.isLoggedIn = true
      console.log('设置用户信息:', info)
      // 确保isMerchant字段被正确处理
      if (info && typeof info.isMerchant === 'boolean') {
        console.log('用户商家身份:', info.isMerchant)
      } else {
        // 如果没有isMerchant字段，默认为false
        if (this.userInfo) {
          this.userInfo.isMerchant = false
        }
      }
    },

    // 设置访问令牌
    setAccessToken(token, expiresIn) {
      this.accessToken = token
      // 设置过期时间（当前时间 + 过期时间）
      this.expiresIn = Date.now() + (expiresIn * 1000)
    },

    // 登录操作
    async login(credentials) {
      try {
        // 调用登录API
        const { accessToken, expires_in, userInfo } = await loginApi(credentials)
        
        // 设置访问令牌和过期时间
        this.setAccessToken(accessToken, expires_in)
        
        // 设置用户信息
        this.setUserInfo(userInfo)
        
        return true
      } catch (error) {
        console.error('登录失败：', error)
        return false
      }
    },

    // 登出操作
    logout() {
      this.userInfo = null
      this.accessToken = null
      this.expiresIn = null
      this.isLoggedIn = false
      this.permissions = []
      // 清除相关的用户Cookie
      const cookies = ['displayPhone', 'email', 'id', 'nickName', 'phone', 'refreshToken', 'token', 'icon'] // 包含截图和代码中的用户相关cookie
      cookies.forEach(name => {
        document.cookie = `${name}=; path=/; expires=Thu, 01 Jan 1970 00:00:00 GMT`
        document.cookie = `${name}=; path=/; domain=${window.location.hostname}; expires=Thu, 01 Jan 1970 00:00:00 GMT`; // 尝试清除带domain的cookie
      })
      // 重置刷新token的Promise
      refreshTokenPromise = null
    },

    // 刷新令牌
    async refreshToken() {
      // 如果已经有一个刷新请求在进行中，直接返回该Promise
      if (refreshTokenPromise) {
        return refreshTokenPromise
      }

      // 创建新的刷新请求
      refreshTokenPromise = (async () => {
        try {
          // 调用刷新token API
          const { accessToken, expires_in } = await refreshTokenApi()
          
          // 更新访问令牌
          this.setAccessToken(accessToken, expires_in)
          
          return true
        } catch (error) {
          console.error('刷新令牌失败：', error)
          // 如果是refreshToken不存在或无效，直接登出
          if (error.message === 'No refresh token available') {
            this.logout()
            return false
          }
          
          // 其他错误，不再自动重试，直接返回失败
          this.logout()
          return false
        } finally {
          // 无论成功失败，都清除Promise缓存
          setTimeout(() => {
            refreshTokenPromise = null
          }, 1000) // 添加1秒延迟，防止短时间内多次调用
        }
      })()

      return refreshTokenPromise
    },

    // 检查并刷新token
    async checkAndRefreshToken() {
      // 如果没有token，直接返回false
      if (!this.accessToken) {
        return false
      }

      // 如果token即将过期（比如还有5分钟过期），尝试刷新
      const fiveMinutes = 5 * 60 * 1000
      if (this.expiresIn && this.expiresIn - Date.now() < fiveMinutes) {
        return await this.refreshToken()
      }

      return true
    },

    // 更新用户信息
    async updateUserInfo(data) {
      try {
        // TODO: 调用更新用户信息API
        const updatedInfo = await updateUserInfoApi(data)
        this.userInfo = { ...this.userInfo, ...updatedInfo }
        return true
      } catch (error) {
        console.error('更新用户信息失败：', error)
        return false
      }
    },

    // 更新用户商家身份
    updateUserMerchantStatus(isMerchant) {
      if (this.userInfo) {
        this.userInfo = { ...this.userInfo, isMerchant }
        console.log('用户商家身份已更新:', this.userInfo)
      }
    },

    // 添加收货地址
    addAddress(address) {
      if (address.isDefault) {
        // 将其他地址设置为非默认
        this.addresses.forEach(addr => addr.isDefault = false)
      }
      this.addresses.push(address)
    },

    // 更新用户设置
    updateSettings(settings) {
      this.settings = { ...this.settings, ...settings }
    },

    // 设置权限
    setPermissions(permissions) {
      this.permissions = permissions
    }
  },

  // 持久化配置
  persist: {
    enabled: true,
    strategies: [
      {
        key: 'user',
        storage: localStorage,
        paths: ['userInfo', 'settings', 'accessToken', 'expiresIn']
      }
    ]
  }
})